2dspere index in {mongodb}

aliases
No value
tags
mongodb/index
description
No value
links
0200 mongodb ๐Ÿฅฌ https://www.mongodb.com/docs/manual/geospatial-queries/#geospatial-indexes
status
ai response
project
false
area
false
resource
false
title
2dspere index in {mongodb}
created
2025-03-04T15:55:32
updated
2025-03-06T13:11:31

mongodb์—์„œ $geoNear๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒ€์ƒ‰์„ ํ•˜๊ธฐ ์œ„ํ•ด์„  ๋ฐ˜๋“œ์‹œ 2d ํ˜น์€ 2dsphere ์ธ๋ฑ์Šค๊ฐ€ ์ •ํ•ด์ง„ ์ปฌ๋Ÿผ์— ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


์•„๋ž˜ ๋ฌธ์„œ๋Š” MongoDB์—์„œ ์ œ๊ณตํ•˜๋Š” 2dsphere ์ธ๋ฑ์Šค(์ง€๊ตฌ ํ‘œ๋ฉด์„ ๊ทผ์‚ฌํ•˜์—ฌ ๊ตฌ๋ฉด ์ƒ์˜ ์œ„์น˜ ์ •๋ณด๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•œ ์ธ๋ฑ์Šค)์— ๋Œ€ํ•ด, ์ง€๋ฆฌ์  ์ฟผ๋ฆฌ์— ์‚ฌ์šฉ๋˜๋Š” $geoNear ๋ช…๋ น(Aggregation Pipeline ๋‹จ๊ณ„)๊นŒ์ง€ ํฌํ•จํ•ด ํ•œ๊ตญ์–ด๋กœ ์ •๋ฆฌํ•œ ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค. ๊ณต์‹ ๋ฌธ์„œ( MongoDB ๊ณต์‹ Geospatial Queries )๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ์žฌ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.


MongoDB 2dsphere ์ธ๋ฑ์Šค ๊ฐœ์š”

MongoDB๋Š” ์ง€๋ฆฌ ๊ณต๊ฐ„ ์ฟผ๋ฆฌ(Geospatial Query)๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ๋‘ ๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ์ง€๋ฆฌ ๊ณต๊ฐ„ ์ธ๋ฑ์Šค๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ๊ทธ ์ค‘ ํ•˜๋‚˜๊ฐ€ 2dsphere ์ธ๋ฑ์Šค์ž…๋‹ˆ๋‹ค. 2dsphere ์ธ๋ฑ์Šค๋Š” ์ง€๊ตฌ ํ‘œ๋ฉด(๊ตฌ ํ˜•ํƒœ)์„ ๋ชจํ˜•ํ™”ํ•˜์—ฌ, GeoJSON ๊ฐ์ฒด ๋˜๋Š” ์ขŒํ‘œ ์Œ์œผ๋กœ ์ง€์ •๋œ ๋„ํ˜•(์ , ์„ , ๋‹ค๊ฐํ˜• ๋“ฑ)์— ๋Œ€ํ•œ ๊ณต๊ฐ„ ์—ฐ์‚ฐ์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ํŠน์„ฑ์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. ๊ตฌ(็ƒ) ํ˜•ํƒœ์˜ ์ขŒํ‘œ ๊ณ„์‚ฐ

    • 2dsphere ์ธ๋ฑ์Šค๋Š” โ€œ๊ฒฝ๋„(Longitude), ์œ„๋„(Latitude)โ€๋กœ ํ‘œํ˜„๋˜๋Š” WGS84(World Geodetic System 1984) ์ขŒํ‘œ๊ณ„๋‚˜ GeoJSON ์ขŒํ‘œ๊ณ„๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ ๋“ฑ์— ์‹ค์ œ ์ง€๊ตฌ ๊ตฌ๋ฉด์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๊ทผ์‚ฌ๊ฐ’์„ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.
  2. ๋‹ค์–‘ํ•œ GeoJSON ํ˜•ํƒœ ์ง€์›

    • Point (์ )
    • LineString (์„ )
    • Polygon (๋‹ค๊ฐํ˜•)
    • MultiPoint, MultiLineString, MultiPolygon
    • GeometryCollection
    • ์ด๋Ÿฌํ•œ ๋„ํ˜•๋“ค ๊ฐ„์˜ ๊ด€๊ณ„(ํฌํ•จ ์—ฌ๋ถ€, ๊ต์ฐจ ์—ฌ๋ถ€, ๊ทผ์ ‘๋„ ๋“ฑ)๋ฅผ ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ์ง€๋ฆฌ์  ์—ฐ์‚ฐ์„ ์œ„ํ•œ ์ „์šฉ ์ฟผ๋ฆฌ ์—ฐ์‚ฐ์ž ์ œ๊ณต

    • $near, $geoWithin, $geoIntersects, $geoNear(์ง‘๊ณ„ ํŒŒ์ดํ”„๋ผ์ธ) ๋“ฑ์„ ํ†ตํ•ด, ๋ฐ˜๊ฒฝ ๋‚ด ์œ„์น˜ ๊ฒ€์ƒ‰, ํŠน์ • ์˜์—ญ(ํด๋ฆฌ๊ณค ๋“ฑ)์— ํฌํ•จ๋œ ๋ฌธ์„œ ๊ฒ€์ƒ‰, ๋„ํ˜• ๊ฐ„ ๊ต์ฐจ ์—ฌ๋ถ€ ๋“ฑ์„ ๋น ๋ฅด๊ฒŒ ๊ฒ€์ƒ‰ํ•˜๊ณ  ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2dsphere ์ธ๋ฑ์Šค ์ƒ์„ฑ ๋ฐฉ๋ฒ•

์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•  ํ•„๋“œ ๊ตฌ์กฐ

์ผ๋ฐ˜์ ์œผ๋กœ 2dsphere ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด, ํ•ด๋‹น ํ•„๋“œ์—๋Š” GeoJSON ํ˜•ํƒœ ๋˜๋Š” [๊ฒฝ๋„, ์œ„๋„] ๋ฐฐ์—ด ํ˜•์‹์ด ์ €์žฅ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์‹œ๋กœ location ํ•„๋“œ์— Point ํƒ€์ž…์˜ GeoJSON์„ ์ €์žฅํ•œ๋‹ค๊ณ  ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ํ˜•ํƒœ๊ฐ€ ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค:

{
  "_id": 1,
  "name": "Seoul City Hall",
  "location": {
    "type": "Point",
    "coordinates": [126.9779692, 37.566535]
  }
}

MongoDB์—์„œ ์ขŒํ‘œ๋Š” [๊ฒฝ๋„, ์œ„๋„] ์ˆœ์„œ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2dsphere ์ธ๋ฑ์Šค ์ƒ์„ฑ ์˜ˆ์‹œ

location ํ•„๋“œ๋ฅผ 2dsphere ์ธ๋ฑ์Šค๋กœ ์ƒ์„ฑํ•˜๋ ค๋ฉด ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค:

db.collection.createIndex(
  { location: "2dsphere" }
);

๋˜ํ•œ ๋‹ค๋ฅธ ํ•„๋“œ์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ๋ณตํ•ฉ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, category ํ•„๋“œ์™€ ํ•จ๊ป˜ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

db.collection.createIndex(
  { category: 1, location: "2dsphere" }
);

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด MongoDB๊ฐ€ category๋กœ ๋จผ์ € ์ •๋ ฌํ•œ ๋’ค, ๋™์ผํ•œ ๋ฒ”์ฃผ ๋‚ด์—์„œ location ์ง€๋ฆฌ ์ฟผ๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


2dsphere ์ธ๋ฑ์Šค๋ฅผ ํ™œ์šฉํ•œ ์ฟผ๋ฆฌ

2dsphere ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, MongoDB์—์„œ ์ œ๊ณตํ•˜๋Š” ์ง€๋ฆฌ ๊ณต๊ฐ„ ์ „์šฉ ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด ์ง€๋ฆฌ์  ์—ฐ์‚ฐ์„ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1. $near

์˜ˆ์‹œ) ์„œ์šธ์‹œ์ฒญ(coordinates: [126.9779692, 37.566535])์„ ๊ธฐ์ค€์œผ๋กœ 2km ์ด๋‚ด์— ์žˆ๋Š” ๋ฌธ์„œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ , ๊ฐ€๊นŒ์šด ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๋Š” ์ฟผ๋ฆฌ:

db.collection.find({
  location: {
    $near: {
      $geometry: {
        type: "Point",
        coordinates: [126.9779692, 37.566535]
      },
      $maxDistance: 2000 // ๋‹จ์œ„: ๋ฏธํ„ฐ
    }
  }
});

2. $geoWithin

์˜ˆ์‹œ) ์•„๋ž˜๋Š” [126.90, 37.55] ~ [127.10, 37.70] ๋ฒ”์œ„์˜ ์‚ฌ๊ฐํ˜• ๋‚ด๋ถ€์— ์œ„์น˜ํ•œ ๋ฌธ์„œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ์ฟผ๋ฆฌ์ž…๋‹ˆ๋‹ค:

db.collection.find({
  location: {
    $geoWithin: {
      $geometry: {
        type: "Polygon",
        coordinates: [
          [
            [126.90, 37.55], 
            [127.10, 37.55], 
            [127.10, 37.70], 
            [126.90, 37.70], 
            [126.90, 37.55]
          ]
        ]
      }
    }
  }
});

3. $geoIntersects

์˜ˆ์‹œ) region ํ•„๋“œ์— ์ €์žฅ๋œ ํด๋ฆฌ๊ณค์ด, ์•„๋ž˜ ์ •์˜๋œ ํด๋ฆฌ๊ณค๊ณผ ๊ต์ฐจํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํŒ๋ณ„ํ•˜๋Š” ์ฟผ๋ฆฌ:

db.collection.find({
  region: {
    $geoIntersects: {
      $geometry: {
        type: "Polygon",
        coordinates: [
          [
            [126.90, 37.55],
            [127.00, 37.55],
            [127.00, 37.65],
            [126.90, 37.65],
            [126.90, 37.55]
          ]
        ]
      }
    }
  }
});

$geoNear (Aggregation Pipeline)

$geoNear๋Š” ์ง‘๊ณ„(Aggregation) ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ง€๋ฆฌ ๊ณต๊ฐ„ ์—ฐ์‚ฐ ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค. $near ์ฟผ๋ฆฌ์™€ ์œ ์‚ฌํ•˜๊ฒŒ ๊ฑฐ๋ฆฌ์— ๋Œ€ํ•œ ๊ณ„์‚ฐ ๋ฐ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ, ์ง‘๊ณ„ ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ๊ฒฐํ•ฉํ•ด ๋ณด๋‹ค ๋ณต์žกํ•œ ๋ถ„์„์ด๋‚˜ ํ›„์† ์ฒ˜๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ ๋ฐฉ๋ฒ•

db.collection.aggregate([
  {
    $geoNear: {
      near: {
        type: "Point",
        coordinates: [126.9779692, 37.566535]
      },
      distanceField: "dist.calculated",
      maxDistance: 2000,        // ์„ ํƒ ์‚ฌํ•ญ (๋ฏธํ„ฐ ๋‹จ์œ„)
      query: { category: "cafe" }, // ๋‹ค๋ฅธ ํ•„๋“œ์— ๋Œ€ํ•œ ํ•„ํ„ฐ ์กฐ๊ฑด ๊ฐ€๋Šฅ
      spherical: true             // ๊ตฌ๋ฉด(์ง€๊ตฌ) ๊ณ„์‚ฐ ์‚ฌ์šฉ ์—ฌ๋ถ€
    }
  },
  {
    $project: {
      name: 1,
      "dist.calculated": 1
    }
  }
]);

์ด๋ ‡๊ฒŒ $geoNear๋ฅผ ํ™œ์šฉํ•˜๋ฉด, ๊ฑฐ๋ฆฌ ์ •๋ณด๋ฅผ ๊ณ„์‚ฐํ•ด ๋ฌธ์„œ์— ์ถ”๊ฐ€ํ•œ ๋’ค, ํ›„์† $match, $group, $project ๋“ฑ์˜ ํŒŒ์ดํ”„๋ผ์ธ ์Šคํ…Œ์ด์ง€๋กœ ๋‹ค์–‘ํ•œ ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์ฃผ์˜์‚ฌํ•ญ ๋ฐ ๋ฒ ์ŠคํŠธ ํ”„๋ž™ํ‹ฐ์Šค

  1. ์ธ๋ฑ์Šค ์ƒ์„ฑ ์‹œ ์ขŒํ‘œ ์ˆœ์„œ ์ค€์ˆ˜
    • [๊ฒฝ๋„, ์œ„๋„] ์ˆœ์„œ๋ฅผ ์ž˜๋ชป ์ง€์ •ํ•˜๋ฉด ์˜๋„์™€ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ํ•„๋“œ ๋ฐ์ดํ„ฐ ํ˜•์‹
    • location.type์ด Point, Polygon ๋“ฑ ์œ ํšจํ•œ GeoJSON ํƒ€์ž…์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    • coordinates ๋ฐฐ์—ด๋„ ์˜ฌ๋ฐ”๋ฅธ ๊ตฌ์กฐ๋ฅผ ๊ฐ–์ถฐ์•ผ ํ•ฉ๋‹ˆ๋‹ค. (ํŠนํžˆ Polygon์˜ ๊ฒฝ์šฐ ํ๊ณก์„ ์œผ๋กœ ์ •์˜)
  3. ๋ณตํ•ฉ ์ธ๋ฑ์Šค ์‚ฌ์šฉ ์‹œ ๊ณ ๋ ค ์‚ฌํ•ญ
    • ์ง€๋ฆฌ ๊ณต๊ฐ„ ์ธ๋ฑ์Šค์™€ ์ผ๋ฐ˜(1, -1) ์ธ๋ฑ์Šค๋ฅผ ํ•จ๊ป˜ ์“ธ ๋•Œ๋Š” ์ฟผ๋ฆฌ ํŒจํ„ด์„ ์ฃผ์˜ ๊นŠ๊ฒŒ ์‚ดํŽด๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด { category: 1, location: "2dsphere" }๋ฅผ ๋งŒ๋“ค๋ฉด, ์ฟผ๋ฆฌ ์‹œ category๋ฅผ ๋จผ์ € ์„ ๋ณ„ํ•œ ๋’ค location ์ง€๋ฆฌ ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • ์ง€๋ฆฌ ์—ฐ์‚ฐ๊ณผ ๋ฒ”์œ„ ์ฟผ๋ฆฌ๊ฐ€ ํ•จ๊ป˜ ์žˆ์„ ๋•Œ๋Š” ์ฟผ๋ฆฌ ๊ณ„ํš(Explain)์„ ํ†ตํ•ด ์„ฑ๋Šฅ์„ ์ ๊ฒ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  4. ์ง€๋ฆฌ์  ๋ฒ”์œ„ ์ œํ•œ(์ฟผ๋ฆฌ ์Šค์บ” ์ตœ์†Œํ™”)
    • $near ํ˜น์€ $geoNear ์‚ฌ์šฉ ์‹œ, $maxDistance ํ˜น์€ maxDistance๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์Šค์บ” ๋ฒ”์œ„๊ฐ€ ์ปค์ ธ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๊ฐ€๋Šฅํ•œ ๊ตฌ์ฒด์ ์ธ ๋ฐ˜๊ฒฝ ๋˜๋Š” ์ฟผ๋ฆฌ ์กฐ๊ฑด์„ ์„ค์ •ํ•˜์—ฌ ํšจ์œจ์„ ๋†’์ด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
  5. ์ •ํ™•๋„ vs ์„ฑ๋Šฅ
    • 2dsphere ์ธ๋ฑ์Šค๋Š” ์‹ค์ œ GIS(์ง€๋ฆฌ ์ •๋ณด ์‹œ์Šคํ…œ)์— ๋น„ํ•ด ์˜ค์ฐจ ๋ฒ”์œ„๊ฐ€ ์žˆ๋Š” ๊ทผ์‚ฌ ๊ณ„์‚ฐ์„ ํ•ฉ๋‹ˆ๋‹ค.
    • ๊ทธ๋Ÿฌ๋‚˜ ๋Œ€๋ถ€๋ถ„์˜ ์œ„์น˜ ๊ธฐ๋ฐ˜ ์„œ๋น„์Šค(O2O, ์ง€๋„, ๋งค์žฅ ์ฐพ๊ธฐ ๋“ฑ)์—๋Š” ์ถฉ๋ถ„ํ•œ ์ •ํ™•๋„๋ฅผ ์ œ๊ณตํ•˜๋ฏ€๋กœ, ์š”๊ตฌ์‚ฌํ•ญ์— ๋งž์ถ”์–ด ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ ์‹œ๋‚˜๋ฆฌ์˜ค

  1. ๋งค์žฅ ์œ„์น˜ ๊ฒ€์ƒ‰

    • ์‚ฌ์šฉ์ž ํ˜„์žฌ ์œ„์น˜์—์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋งค์žฅ 10๊ณณ ์ฐพ๊ธฐ
    • $near ๋˜๋Š” $geoNear ์‚ฌ์šฉ + $limit ์„ค์ •
  2. ํƒ์‹œ/๋ฐฐ๋‹ฌ ์„œ๋น„์Šค

    • ๋“œ๋ผ์ด๋ฒ„(๋˜๋Š” ๋ผ์ด๋”)์˜ ์œ„์น˜๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ €์žฅํ•˜๊ณ , ์‚ฌ์šฉ์ž ์ฃผ๋ณ€ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ๊ฒ€์ƒ‰
    • $geoWithin์œผ๋กœ ๊ตฌ์—ญ ๊ธฐ๋ฐ˜ ํ•„ํ„ฐ, $near ๋˜๋Š” $geoNear๋กœ ๊ฑฐ๋ฆฌ ๊ธฐ๋ฐ˜ ์ •๋ ฌ
  3. ์ง€์—ญ ๊ฒฝ๊ณ„ ๊ธฐ๋ฐ˜ ํ†ต๊ณ„

    • Polygon์œผ๋กœ ํ–‰์ • ๊ตฌ์—ญ์„ ์ €์žฅํ•˜๊ณ , $geoWithin์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ์†ํ•œ ํ–‰์ • ๊ตฌ์—ญ์„ ํŒ๋ณ„
    • $geoIntersects๋กœ ๊ต์ฐจ ์—ฌ๋ถ€ ๋ถ„์„(์˜ˆ: ์ด๋ฒคํŠธ ๋ฐ˜๊ฒฝ๊ณผ ํ–‰์ • ๊ตฌ์—ญ์ด ์–ผ๋งˆ๋‚˜ ๊ฒน์น˜๋Š”์ง€)
  4. ๋ฐ์ดํ„ฐ ํ›„์ฒ˜๋ฆฌ/๋ถ„์„

    • $geoNear๋ฅผ Aggregation Pipeline์— ๊ฒฐํ•ฉํ•˜์—ฌ, ๊ฒ€์ƒ‰๋œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ํ†ต๊ณ„๋‚˜ ๊ทธ๋ฃน ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰

๊ฒฐ๋ก 

MongoDB์˜ 2dsphere ์ธ๋ฑ์Šค๋Š” ์ง€๊ตฌ ํ‘œ๋ฉด์„ ๋‹ค๋ฃจ๋Š” ๋‹ค์–‘ํ•œ ์œ„์น˜ ๊ธฐ๋ฐ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ•ต์‹ฌ์ ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋ณต์žกํ•œ ๋ถ„์„์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ $geoNear ๋‹จ๊ณ„์™€ Aggregation Pipeline์„ ๊ฒฐํ•ฉํ•ด ๋‹ค์–‘ํ•˜๊ฒŒ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค๋ฌด์—์„œ๋Š” ๋ฐ์ดํ„ฐ ๋ถ„ํฌ์™€ ์‹ค์ œ ์ฟผ๋ฆฌ ํŒจํ„ด์— ๋”ฐ๋ผ ์ง€๋ฆฌ ์ธ๋ฑ์Šค๋ฅผ ์–ด๋–ป๊ฒŒ ์„ค๊ณ„ํ• ์ง€, ์ฟผ๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ์ตœ์ ํ™”ํ• ์ง€๋ฅผ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.


์ฐธ๊ณ  ์ž๋ฃŒ

์œ„ ๋ฌธ์„œ๋Š” MongoDB 2dsphere ์ธ๋ฑ์Šค ๋ฐ $geoNear๋ฅผ ํฌํ•จํ•œ ์ง€๋ฆฌ ๊ณต๊ฐ„ ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ํ•ต์‹ฌ ๊ฐœ๋…๊ณผ ์‚ฌ์šฉ๋ฒ•์„ ์ •๋ฆฌํ•œ ๊ฒƒ์œผ๋กœ, ์‹ค์ œ ํ”„๋กœ์ ํŠธ ์ ์šฉ ์‹œ์—๋Š” ๋” ์ƒ์„ธํ•œ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง, ์ƒค๋”ฉ, ์„ฑ๋Šฅ ํŠœ๋‹ ์ „๋žต ๋“ฑ์„ ํ•จ๊ป˜ ๊ณ ๋ คํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.


Troubleshooting